Win32 Global API Hook - 3 Win32  α׷ (1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  ҽ? Ȥ  Ȱɸ̴... , α׷ϱ⿡   ƿԽϴ. 
 α׷ .  , Ϳ ü վ ⸦ ¸ , 
 ش    ٶ Ķϴ    Խϴ.  ̽ð 
  󱼻, Ű, 콺  ո  ذ ߿ ϰ ִ ̶ 
 α׷ӿ  ұ ǰ Ÿ (?)   ؾϴ. ^^

 ±  ̴ ñϱ.   ؼ ٸ μ API ŷ Ͻ 
е鵵 װ,  ޴ е鵵  𸣰ڽϴ. ¶  ±   
ʶ ú  ´  ʶ Ҽ ְڽϴ. ׷ ʰ    
   Ѱ(, ̶  ƽ?)̴ϱ ʺ ưư(!!)ڱ. ^^ 
,  (?)  οϸ鼭 ³ϴ.

" α׷̶ ϴ° ڰ  ߻鿡  ϴ°Ͱ .    
     ϴ  ڵ鿡 ׵鸸 Ҽ ִ  
 ٸ ư  ִ°̴."

(  Ī ϰڽϴ.)

1. ,    ܼ !!

  ƴٰ Ѵ. ׷ ̰ Ȯ ϸ  α׷ϱⰡ ƴٴ 
ǹ̴. ֳĸ  ü ſ ܼϱ ̴.  ü ſ ܼϱ⶧  ܼ
 ɸ  ߼ ´  ø̼ ۼϱⰡ ſ ŷӴٴ°̴. ( ֱٿ 
  ޾ ݰ( ̰͵  ƴϴ.  ؼ ׷ٴ 
.) ڵ Ǹ ϱ ) ڰ  ó α׷  󸶵 ʾ 
 C  α׷Ӱ ̷ ߴ. ⼭ C  κ 
޾ ص Ұ̴.

"C "   ٳ ־ξ!!"  Ѵٸ,  "ٳ
    ̵Ѵ,   ,  ,  ڸ ٳ ְ, 
  ݾƶ!!" ̷ ɵǾ Ѵ"

 ϸ    ƴҼ.  C "   ٳ ־
" ϸ    ̵ؾ Ѵٴ°,    Ѵٴ°,  , 
ٳ ־ ϸ,   ݾƾ ϴ° ,  ̷ Ϸ 
  ־ Ѵٴ ̴. ׷ C  ᱹ ൿϴ  ۿ 
,  ϴ    Ұΰ ΰ̴.  C 
ٴ  ȶϴٴ ̴.

  ϼۿ .      α׷ϴ 뿡 
 ſ  .  DOS "LOTUS123" OAα׷̳, ÿ û α⸦  "
þƿ" 1ź  α׷   ۵Ǿٴ ͸   ô뿡 
 ó ư   ƴϾ̴.  츮 ٴ ȶ C Ľ
Į  ޾ ͼ  ϰ ̴ ̴. (  񱳵 
   α׷ , پ ) ο ߵ   
 ٸ Ƴ ֵ 츮 ݴ  ϸ, ׵ ϸ ̸ ִ 
 Ҷ.

 ;ƴ϶ ⸸ ߴµ ׷ٰ    ƴѰ ƴϴ. Ƹ ȯ
 ƹ   󿡼  ̶  ̴.   ٸ
 CPU  óϴ  ܰ  ˴ٽ ڵ̴. ׷   
׷ ϰų, ڵ常   ϱ ſ ۾̹Ƿ(ҰѰ ƴϴ. 
  ̷ ۾ ϱ⵵ ߾.  츮 ׷   ϰԵɰ̴.)   
ϴ  ǥ־ ϴµ ̰ ٷ ̴.

 ؼ Ѵٸ  ˸ α׷ 帧 м  , Ѵٸ α׷ 
´ Ҽ ִ.  ̹̽ , ̳ʸ (̳ʸ 
ڵ ȯϴ°)ؼ Cڵ带  ۾  ϱ⵵ Ѵ. ̷ ۾ Ʋ 
(reverse engineering)̶ ϴµ   ũϰų ġϴ ۾鵵   
 ̶ θ ְڴ.  ̷ϵ  ƴϴ. Ϻ  ؼ 
  ̳ʸ  ȯ( Ϸ   ְڴ.)   ظ ʿ ϸ, 
 ɺ ŵ  ̳ʸ , Ϳ Լּҵ  ܼ ޸ּҷθ 
ϰ Ǹ, MFC Ŭ̺귯 ̿ϴ 쿡    Ǵ ̳ʸ  
 ϱ 籸 Ǿ. ģ ģ  ̳ʸ  Ҽϰ
   anti-debugging ڵ带 ϴ 쵵   ̳ʸ Ϻϰ ϱ 
   ƴҼ .

ٽ  ƿͺ. 츮 ̹ ¿  ϴ°  α׷ ۼϴ 
̶⺸ٴ  Ϸ  ڵ带  CPU  α׷ ؼ
 ϴ ϱ     Ѵ.    ø
 ۼҼ ִ. ׷ ý   Ϸ  ʿ    
ؼ ü Ʈ Ҹ   °  ̴.    
 ζ  쿡 ĩϸ ӵ ߸   쵵  ִ.(ζ
  ͺ  Ϸ ȭ ϴ 찡 ߻Ҽ ֱ⶧
.)

  α׷Ѵٴ    °  °ͺ ũ 
Ѵ.   Ʒ .

; ޽ 
@@: ; start of loop
    invoke GetMessage, addr msg, NULL, 0, 0
    or eax, eax
    je @f
    invoke TranslateMessage, addr msg
    invoke DispatchMessage, addr msg
    jmp @b
@@: ; end of loop

ڰ ϴ  øƮ ڵ Ϻκμ, 츮 API α׷ ۼҶ κ 
 Ǵ ޽ ̴.  Ⱦ C ۼ    
. ̰  ޾ Ư ϱ  ǻ ϱ ̴.   invoke
 ܾ . ̰   1:1 Ǵ ɾ ƴϴ. Ȯϰ ʹٸ C  
 α׷ ۼѴ,  𽺾â ؼ  () ȯ ڵ
 Ȯغ. и invoke ɾ ã   ̴. ̷ ͵ Ʋ ǻ̶ 
Ѵ.   ȯ    ϱ ȯ̳  ִ 
.(ٷ ޾ Ư̴.) ׻ ƴ϶ @@, @f, @b  󺧵    ɶ 
 ּҷ ġȯɰ̴. ̷   α׷ ٴ  ܼ (
 ġȯǴ) °ͺٴ  ϴ ̳  ٴ ǹ̰ ũ. ׷ 츮
  α׷ ۼϷ  ƴϹǷ    ° ַ ٷ
 Ѵ.

2. CPU ˸ α׷ δ !!

 ٽ CPU  ⸦ ؾҶ Դ. ᱹ α׷ ϴ ü CPU̹Ƿ CPU 𸣰
 α׷   .  ý α׷ ٷ  å CPU ŰĿ  
  ,   ⼭ ٷ Ƿ ڼѰ͵  ̿ϵ ϰ, 
   ¤ Ѿ  ϰڴ. CPU ˱ؼ CPU ٷ Ϳ  
˾ƾ Ұ̴. CPU ٷ ִ Ϳ   CPU ̰ ְ    ѵ
 ƴ, 츮 Intel x86 迭 CPU ַ س. CPU óϴ   CPU 
׷̵ɶ ߰Ǳ⵵ ȮǱ⵵ ϴµ( MMX ڵ带 ִ. MMX ڵ CPU Ƽ
̵ ó  ϱؼ Ǵ ɾƮ̴.) ʿ ɾ  ִٰ ˾ƺ
 ϰ, ϴ CPU ٷ Ϳ  غ.  ¿ CPU ޸𸮸 ٷٰ ߾
µ,  ޸𸮿 Ͷ Ҹ ͷν ٷ. ʹ CPU  ӽñ
  ɰ̴.  CPU ٷ   ü ɰ̴. x86 Ϳ 8 
Ϳ 6 ׸Ʈ, νƮ  Ϳ ÷׷,  ͵, 
  ִµ  ڰ ٷ ִ    뵵  .

<  뵵>

eax    :  Լ ȯ ¿뵵 ȴ.
ebx :  ƯѰ ° . ׳  ȴ.
ecx : ݺ īͷ ȴ.
edx : 64Ʈ(large integer)   32Ʈ  뵵 ȴ.

esi :  ޸ ̵̳ 񱳽ÿ ּҸ  뵵 ȴ.
edi :  ޸ ̵̳ 񱳽ÿ (Ÿ)ּҸ  뵵 ȴ.

esp : ,  (x86  Ʒ ڶǷ δ ٴ ǰڴ.) Ų. 
ÿ Ͱ Ǫϰų ˵ɶ ȴ.
ebp : , ν(Լ)    뵵 ȴ.

cs : ڵ弼׸Ʈ, ڵ念 ׸Ʈ Ѵ. 32Ʈ 巹̿ ǹ̰ .
ds : ͼ׸Ʈ, Ϳ ׸Ʈ Ѵ.  32Ʈ 巹̿ ǹ̰ .

eip : νƮ , (Ȯ Ǿ) ڵ ּҸ  ִ.

̹ۿ  Ͱ   CPU  ϰų, ڰ ǵ帱 °͵̹
 ϴ  Ʈ ͸̶ ϰ Ѿ.  ó Դ  
 ϰ, ϴ ܿδ ƴ ʿ  Ʈؼ ٿ. ߿  ڵ带 ԵǸ ذ 
ɰ̹Ƿ...  ξ e  ̸(eax, esi, eip ...) extended ڷμ 32Ʈ 
Ȯ巹Ͷ ǹ̸, 4Ʈ(32Ʈ)ũ⸦ ,  16Ʈ Ϸ e  ax 
 · ,  /  Ϸ ah, al · ȴ.

3. ȭ , ƾ(Լ) !!

ƾ  Լ(ȯ ִ) ν(ȯ ) ϴµ ƽôٽ C ν
 Լ     Լ Ѵ. ׷Ƿ C ν Լ  
̷ Ѵ.  α׷ ̶  mainԼ ۵ν ۵Ǹ, mainԼ 
ν α׷ ȴٰ ˰ִ. ̷ α׷ ü ϳ Լ ޵Ǵ° Ϲ̹
 Լ  Ǵ ȴٴ  α׷ 帧 ϴµ ſ ߿ ǹ̸ .

Լ(Ǵ ν) Ư    ڵ嵢̴. Լȣ  α׷ 
(νƮ , ip)  Լ  ڵ Űܼ ѵ  ȣ ڵ ǵ
 Ϸ ۾̴. 鹮 ҿϰ!!  Լȣ  Ǵ VC++ 𽺾 
 Ȯغ .

 Ʒ  ڵ带 ۼѵ ſ 𽺾ڵ带 Ȯغ.

int TestFunc(int a, char b)
{
    return a+1;
}

int main()
{
    int ret;
    ret = TestFunc(3, "a");

    return 0;
}

ϴ main()Լ TestFunc() ȣϴ κ 캸.

19:       ret = TestFunc(3, "a");
00401098   push        61h
0040109A   push        3
0040109C   call        @ILT+5(TestFunc) (0040100a)
004010A1   add         esp,8
004010A4   mov         dword ptr [ebp-4],eax

 [ɾ] [Ű], ...   µ ϴ   ɾ 캸.
push   3  "a" ÿ ִ´.  ۾ ʹ 8Ʈ ϴµ, 
 4Ʈ ĵǱ⶧ 1Ʈ ڸ ִ 4Ʈ Ѵ. Ͱ ϴ 
  Ʒ ڶ⶧̴.
call  TestFunc Լ ּҸ ű(Ѵ). call  jmp ɰ Ҿ 帧
(eip) Ҽ ִ ̴.  jmp ܼ ġ űµ ġ, call ƿ ּҸ 
ÿ ѵ ġ ű.  TestFunc ȣǴ  ȣǱ  ʹ 12
ŭ ҵǾ ̴.( ŷ Ȯغ.)
add  esp() 8Ʈŭ Ų.  Լ θ ۾ 
ִ ̴. ? ׷ ̻ϴ. Ʊ Ű 8Ʈ + ּ 4Ʈ, и 12Ʈ ҵ
ٰ ߾µ?     Լڵ带  Ҽ ִ. Լ  ּҷ 
ư ret  µ ۾ ÿ  ּҸ popְ ȴ. ᱹ  Ȯϰ 
ȴ.( å  call ɰ ret  ּҸ ϱ  Ѵٰ 
ϴµ,  ŷ 󰡺 ̸ Ȯϰ Ȯ  ִ.)

ڵ TestFunc Լ ڵ̴.   󰡺.

9:    int TestFunc(int a, char b)
10:   {
00401020   push        ebp            ; (1) Լ ڵ !!
00401021   mov         ebp,esp

00401023   sub         esp,40h        ; (2)   Ȯ !!

00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]

11:       return a+1;
00401038   mov         eax,dword ptr [ebp+8]    ; (3) ȯ  !!
0040103B   add         eax,1        

12:   }
0040103E   pop         edi
0040103F   pop         esi
00401040   pop         ebx

00401041   mov         esp,ebp        ; (4) Լ ڵ !!
00401043   pop         ebp
00401044   ret

ϴ  TestFunc ȣ   ´ Ű ǵư ּҰ ִ. (Ʊ 
 Ű 61h, 3 call  ּҸ Ǫߴ.) ̰͵ ѹ Ȯغ. Լ ۿ ߴ
 ɰ(Լ ۿ ߴ Ϸ ߰ȣ ("{")ٰ ߴ ϸ ȴ.), 
쿡 esp  ѵ ޸쿡 ٿ־. ׳  Ʋ Ʈ · 
״ϱ ޸  ư  long hex format(4Ʈ ) ؼ . (޸
  ϸ ڱ   ޸𸮰 Ƣ°찡 ִµ, ̰ VC++  
 . ׷ ٽ ּҸ ָ ȴ.)

0012FF24  004010A1  00000003  00000061  
0012FF30  00000000  00000000  7FFDF000
...

 ýۿ esp  0x0012FF24̴.  Ʒ ڶٰ   ޸𸮻󿡴 
ּ, 3, "a"   ̴. ϴ ּҴ 0x004010a1̰,  3 "a"(ƽŰڵ 
0x61) ùٸ ִ°  ̴.

,  Ű ּҰ   ÿ Ǿ ִ ˾ Լ غ
. "(1)Լ ڵ" .

00401020   push        ebp            ; (1) Լ ڵ !!
00401021   mov         ebp,esp

ϴ, ebp  ÿ Ѵ. ׷ mov  esp  ebp (̵)Ѵ. mov  
ʿ ִ   ̵ϴ ̴.  esp ּҸ Ű Ƿ ebp 
Ҹ Ű ̴. ̰ Ϲ C Լ Ҷ Ǵ  Լ ڵ
̴. ϴ ̻¿ Ű Ϸ  ؾұ? esp+, Ǵ ebp+ · Ű
 Ҽ ̴( Ȯߴó). ׷ esp() Լο  ٸ Լ 
ȣѴٵ簡 ϴ 쿡 󸶵 Ҽ Ƿ Լο ebp  Ű 
. ,  ذ ȵȴٸ ϴ ܿ ˰ . "esp+  Լ Ű(Ķ
) Ѵ."

߰   ϰ "(4)Լ ڵ"   .

00401041   mov         esp,ebp        ; (4) Լ ڵ !!
00401043   pop         ebp
00401044   ret

Լ ڵ Լ ڵ ݴ ۾ ش. esp  ebp ѵ, ÿ  
ebp Ѵ. pop push ݴ ÿ ִ ͸   Ѵ. (Ȥ 򰥸 
Ľɿ ϸ pop ebp ebp ´ٴ ǹ̰ ƴϰ ÿ  ͸ ebp ִ´
 ǹ̴. ڴ ó ̰ 򰥷ȴ ... ٸ ȱ׷?)  ret 
 Լ ȣ  ǵư. (̰͵ Ȯ ϸ Լ ȣ ٷ ּҷ ư.) 
Ʊ call ּҸ ÿ ǪѴ Ѵٰ ߴµ, ret ݴ ÿ ּҸ 
ϰ  ּҷ Ѵ.

, ׷  .  "(2)  Ȯ" 캸.

00401023   sub         esp,40h        ; (2)   Ȯ !!

sub  add ɰ ݴ  ϴ  (esp) 40h ŭ ҽŲ. ̰ 
ÿ    Ҵϴ    Ǵ  esp esp-40h 40hŭ
    Ұ̶ ǹ̴. ¿ LoadLibrary ȣҶ  Ű
 ڿ ؼ   ߾. (  ȳٸ ¿ 
FAKE_LOADLIBRARY_CODE ü ϴ InjectSpyDll() Լ ٽ  .) ¶ ⼭ 
 ߿   ebp- · ٵȴٴ ̴.(  ذ ȵȴٸ ܿ
 ˰.)

⼭ ִ ϳ ߰ϰ ȴ.   ڵ    ̳ʸ 
̴.  TestFunc()   ʴµ ұϰ    Ȯϰ 
   0xcc  ä° ִ.    ϰ Ǹ TestFunc() Ʒó
  ڵ ȯȴ.

00401000   mov         eax,dword ptr [esp+4]
00401004   inc         eax
00401005   ret

¶       0xcc ä غ  0xcc   ˾
 ʿ䰡 ִ. 0xcc  ڵ int 3 ̴. ( ¿  ִ. ٷ ߴ̴ !!) 
ʱȭ    0xcccccccc   쿬 ƴϴ. Ϸ  ϶ 
 ó    ˻ƾ Ѱ   ִ. (ϴ  ޸  
 Ǹ ߴ ؼ Ű Ȱȭɰ̸ ̺Ʈó  ó ټ 
.)

 "(3)ȯ " .

00401038   mov         eax,dword ptr [ebp+8]    ; (3) ȯ  !!
0040103B   add         eax,1        

տ ebp+  Լ Ű Ѵٰ ߴ. ȣ("[]") ǥô C *(
)  뵵 ȴ. ȣ  ͷ νϰ Ͱ Ű  
. · ù° Ű  a eax Ϳ ư, add  1 Ų. eax ʹ 
 ϰ ¿뵵 ȴ.  a+1  eax 鼭 ϰ óȴ.

4. 

   ⺻  Ҿ C Լȣ  Ǵ  
  ˾ƺҴ.  ¿  ߿  Ϲ ص C Լȣ ī 
. Ű   , Լ ȯ   Ǵ. ̰͵鸸ŭ ݵ
 ϰ Ѿ ٶ.  δ Լȣ ī ϴ    VC++ 
Ÿ ̿ϴ°̴.  , ޸, 𽺾  
(Step-by-Step) ϸ鼭 Ϳ ޸  ϸ鼭 󰡴ٺ ϱⰡ Ѱ 
̴.      ׸ ׷鼭 ̴. 

5. ¿

´ Win32  ι° ð ɰ̴. ð   Լȣ ī  
 ȣԾ࿡  Լ ¸ ٷ, ǹ ݺ    ð
 ȴٸ Win32 ȭ ó(SEH)   Ǵ ٷﺸ .  ִ 
  ± Ѵٸ "ýα׷ " Ҹ ̷ ۿ ؼ 
ɵְ ٷ ̴. ( ¸     ̴.)  ̷ 
 API ŷ     ִ. ũ ٸ    ׷ 
 ̰ ̴. Ǹ Ͱ ½ Ʈ̴ ںе ٵ õҸ  ϳ Ұϰ 
 ¸ ġ Ѵ.

ýα׷ֿ    ϴٽѵ ִ åѱ ҰѴ. Ľɿ 
帮 å ڳ ǻ ڴ ƹ 谡  . ()Ʈ  ǻ翡
  "ı "̶ å̴. å  輺  ũμƮ  ý
 ŷ  ¸  ִµ,     ѱ å Ⱓϰ Ǿ. 
 ý ŷ̰  ̷۱ ٷ ,  ŷ  ܼ α
  Ұϴµ ġ ε   å  α׷Ӹ     
ϰ ִ. ̵        ʰ 󰥼 
̴.

<⼳ ϳ.>
 XP ð ھ ٰԴ.  ȸ翡 ̹ ౸Ÿ ģ ̰,  
 ε  س ¶. XP  忡 ؼ ϴ  е鵵 
̹  ƽ, MS  ü  ִ Ʈ ȸ簡 ϳ  ݰų 
  ⿡ óϴ° 鼭 ̹  ?  ɽ  ϰ մϴ. ͳ ޽, 
ͳ ȭ, CD Writer, DVD ÷̾, ιȭ  Եȴٰ ϴ... ü   
Ѵٴ  忡  ӿ Ʋ...  Ѱ  ϱ?